"""
数据抓取智能体
负责从 TAPD 系统抓取指定时间范围内的工作项数据
"""

import asyncio
import json
import subprocess
from datetime import datetime
from typing import Dict, List, Optional, Any

from autogen_agentchat.agents import AssistantAgent
from autogen_ext.models.openai import OpenAIChatCompletionClient


class DataScraperAgent(AssistantAgent):
    """数据抓取智能体"""

    def __init__(self, name: str, model_client: OpenAIChatCompletionClient, config: Any):
        system_message = """
        你是一个专业的数据抓取专家，负责从 TAPD 系统抓取工作项数据。

        你的职责：
        1. 使用 MCP 工具 @playwright/mcp 连接到 TAPD 系统
        2. 抓取指定时间范围内的工作项数据，包括：
           - 需求 (Story)
           - 任务 (Task)
           - 缺陷 (Bug)
        3. 提取每个工作项的关键信息：
           - 标题和描述
           - 状态和优先级
           - 创建时间和完成时间
           - 处理人和负责人
           - 工作量估算和实际耗时
        4. 将数据整理成结构化格式返回给团队

        注意事项：
        - 确保数据的完整性和准确性
        - 处理可能的网络异常和页面加载问题
        - 对敏感信息进行适当脱敏处理
        """

        super().__init__(
            name=name,
            model_client=model_client,
            system_message=system_message
        )
        self.config = config

    async def scrape_tapd_data(self, start_date: str, end_date: str) -> Dict[str, Any]:
        """
        抓取 TAPD 数据的核心方法

        Args:
            start_date: 开始日期 (YYYY-MM-DD)
            end_date: 结束日期 (YYYY-MM-DD)

        Returns:
            包含抓取数据的字典
        """

        # 模拟数据抓取过程（实际项目中需要集成真实的 MCP 工具）
        print(f"🔍 正在抓取 TAPD 数据 ({start_date} 至 {end_date})...")

        # 这里应该使用真实的 MCP @playwright/mcp 工具
        # 当前使用模拟数据进行演示
        mock_data = {
            "scrape_info": {
                "start_date": start_date,
                "end_date": end_date,
                "scrape_time": datetime.now().isoformat(),
                "total_items": 45
            },
            "stories": [
                {
                    "id": "1001",
                    "title": "用户登录功能优化",
                    "description": "优化用户登录流程，提升用户体验",
                    "status": "已完成",
                    "priority": "高",
                    "created_date": "2024-07-01",
                    "completed_date": "2024-07-15",
                    "assignee": "张三",
                    "estimated_hours": 16,
                    "actual_hours": 18
                },
                {
                    "id": "1002",
                    "title": "数据报表功能开发",
                    "description": "开发季度数据分析报表功能",
                    "status": "已完成",
                    "priority": "中",
                    "created_date": "2024-07-10",
                    "completed_date": "2024-08-20",
                    "assignee": "李四",
                    "estimated_hours": 40,
                    "actual_hours": 42
                }
            ],
            "tasks": [
                {
                    "id": "2001",
                    "title": "数据库性能优化",
                    "description": "优化查询性能，提升系统响应速度",
                    "status": "已完成",
                    "priority": "高",
                    "created_date": "2024-08-01",
                    "completed_date": "2024-08-10",
                    "assignee": "王五",
                    "estimated_hours": 24,
                    "actual_hours": 20
                }
            ],
            "bugs": [
                {
                    "id": "3001",
                    "title": "登录页面样式异常",
                    "description": "在某些浏览器下登录页面显示异常",
                    "status": "已修复",
                    "priority": "中",
                    "created_date": "2024-09-01",
                    "completed_date": "2024-09-05",
                    "assignee": "赵六",
                    "estimated_hours": 4,
                    "actual_hours": 6
                }
            ]
        }

        await asyncio.sleep(2)  # 模拟网络请求延迟
        print("✅ 数据抓取完成")

        return mock_data

    def format_scraped_data(self, raw_data: Dict[str, Any]) -> str:
        """
        格式化抓取的数据为可读格式

        Args:
            raw_data: 原始数据字典

        Returns:
            格式化的数据字符串
        """

        formatted_output = []
        formatted_output.append("# TAPD 数据抓取结果")
        formatted_output.append("")

        # 基本信息
        info = raw_data.get("scrape_info", {})
        formatted_output.append(f"**抓取时间范围**: {info.get('start_date')} 至 {info.get('end_date')}")
        formatted_output.append(f"**数据抓取时间**: {info.get('scrape_time')}")
        formatted_output.append(f"**工作项总数**: {info.get('total_items')}")
        formatted_output.append("")

        # 需求列表
        stories = raw_data.get("stories", [])
        if stories:
            formatted_output.append("## 需求 (Stories)")
            for story in stories:
                formatted_output.append(f"- **{story['title']}** (ID: {story['id']})")
                formatted_output.append(f"  - 状态: {story['status']}")
                formatted_output.append(f"  - 优先级: {story['priority']}")
                formatted_output.append(f"  - 负责人: {story['assignee']}")
                formatted_output.append(f"  - 预估/实际工时: {story['estimated_hours']}/{story['actual_hours']}h")
                formatted_output.append("")

        # 任务列表
        tasks = raw_data.get("tasks", [])
        if tasks:
            formatted_output.append("## 任务 (Tasks)")
            for task in tasks:
                formatted_output.append(f"- **{task['title']}** (ID: {task['id']})")
                formatted_output.append(f"  - 状态: {task['status']}")
                formatted_output.append(f"  - 优先级: {task['priority']}")
                formatted_output.append(f"  - 负责人: {task['assignee']}")
                formatted_output.append(f"  - 预估/实际工时: {task['estimated_hours']}/{task['actual_hours']}h")
                formatted_output.append("")

        # 缺陷列表
        bugs = raw_data.get("bugs", [])
        if bugs:
            formatted_output.append("## 缺陷 (Bugs)")
            for bug in bugs:
                formatted_output.append(f"- **{bug['title']}** (ID: {bug['id']})")
                formatted_output.append(f"  - 状态: {bug['status']}")
                formatted_output.append(f"  - 优先级: {bug['priority']}")
                formatted_output.append(f"  - 负责人: {bug['assignee']}")
                formatted_output.append(f"  - 预估/实际工时: {bug['estimated_hours']}/{bug['actual_hours']}h")
                formatted_output.append("")

        return "\n".join(formatted_output)